package com.example.api.mq.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

@Slf4j
@Configuration
public class RabbitMqCallbackConfig {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 开启发送消息确认机制后
     * 定制一下RabbitTemplate
     */
    @PostConstruct   //对象创建完调用该方法
    public void initRabbitTemplate(){
        //设置确认回调器  服务器收到消息回调
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             * correlationData  唯一关联数据，包含消息的唯一id
             * ack 是否成功收到  true收到  false未收到
             * cause  失败原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                log.info("消息到达broker回调开始");
                System.out.println(correlationData);
                System.out.println(ack);
                System.out.println(cause);
                log.info("消息到达broker回调结束");
            }
        });

        /**
         * 消息没有正确抵达queue才会回调
         */
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            /**
             * @param message 失败的消息的详细信息
             * @param replyCode 回复的状态码
             * @param replyText 回复的文本内容
             * @param echangeName    发给哪个交换机？
             * @param routingKey    指定的哪个路由key？
             */
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String echangeName, String routingKey) {
                log.error("消息未到达queue回调开始");
                System.out.println(message);
                System.out.println(replyCode);
                System.out.println(replyText);
                System.out.println(echangeName);
                System.out.println(routingKey);
                log.error("消息未到达queue回调结束");
            }
        });
    }

}
